home *** CD-ROM | disk | FTP | other *** search
/ MacFormat España 13 / MacFormat n. 13 (Spain) / Macformat 13.bin / Shareware Internet / Desarrolladores / ICAppSourceKit1.2 / ICHelperWhat.p < prev    next >
Encoding:
Text File  |  1995-11-07  |  15.8 KB  |  562 lines

  1. unit ICHelperWhat;
  2.  
  3. interface
  4.  
  5.     uses
  6.         ICWindowGlobals;
  7.  
  8.     function WhatOpenHelper (wt: WindowType; item: integer): OSErr;
  9.     function WhatActivateHelper (wt: WindowType; item: integer; activate: boolean): OSErr;
  10.     function WhatFlushHelper (wt: WindowType; item: integer): OSErr;
  11.     function WhatCloseHelper (wt: WindowType; item: integer): OSErr;
  12.     function WhatClickHelper (wt: WindowType; item: integer; er: eventRecord): OSErr;
  13.     function WhatKeyHelper (wt: WindowType; item: integer; er: EventRecord): OSErr;
  14.     function WhatCursorHelper (wt: WindowType; item: integer; pt: Point; cursorid: integer): OSErr;
  15.  
  16.     procedure HelperSetSelection(key:Str255);
  17.  
  18. implementation
  19.  
  20.     uses
  21.         Icons, Dialogs, Lists, Fonts, ToolUtils, Errors, ICStrH, 
  22.  
  23.         ICTypes, ICKeys, ICAPI, ICSubs, ICDialogs, ICMiscSubs, ICDocument {X}, ICGlobals, {}
  24.         ICIConSuites, ICStandardFile, ICMovableModal, ICWindows;
  25.  
  26.     const
  27.         ditChange = 1;
  28.         ditMainUserItem = 2;
  29.         ditAdd = 3;
  30.         ditDelete = 4;
  31.         ditList = 5;
  32.  
  33.     const
  34.         ditOK = 1;
  35.         ditCancel = 2;
  36.         ditAddUserItem = 3;
  37.         ditHelper = 4;
  38.         ditAppName = 5;
  39.         ditChooseApplication = 6;
  40.  
  41.     const
  42.         kCellHeight = 36;
  43.  
  44.     type
  45.         InternalAppSpec = record
  46.                 key: Str255;
  47.                 locked: boolean;
  48.                 appspec: ICAppSpec;
  49.             end;
  50.  
  51.     procedure GetNthElement (entries: Handle; index: integer; var res: InternalAppSpec);
  52.     begin
  53.         BlockMove(Ptr(longint(entries^) + (index - 1) * sizeof(InternalAppSpec)), @res, sizeof(InternalAppSpec));
  54.     end; (* GetNthElement *)
  55.  
  56.     procedure SetNthElement (entries: Handle; index: integer; var res: InternalAppSpec);
  57.     begin
  58.         BlockMove(@res, Ptr(longint(entries^) + (index - 1) * sizeof(InternalAppSpec)), sizeof(InternalAppSpec));
  59.     end; (* SetNthElement *)
  60.  
  61.     function EntryLocked (entries: Handle; index: integer): boolean;
  62.         var
  63.             appspec: InternalAppSpec;
  64.     begin
  65.         GetNthElement(entries, index, appspec);
  66.         EntryLocked := appspec.locked;
  67.     end; (* EntryLocked *)
  68.  
  69.     procedure DimButtons (wt: WindowType);
  70.         var
  71.             have_selection: boolean;
  72.             dlg: DialogPtr;
  73.             selection: integer;
  74.             entries: Handle;
  75.             lh: ListHandle;
  76.     begin
  77.         dlg := windowinfo[wt].window;
  78.         lh := ListHandle(windowinfo[wt].items[ditList]^.spare_data);
  79.         entries := Handle(windowinfo[wt].items[ditList]^.data);
  80.         selection := SelectedLine(lh);
  81.         have_selection := (selection <> -1);
  82.         SetDCtlEnable(dlg, ditAdd, not IsDocLocked);
  83.         SetDCtlEnable(dlg, ditDelete, have_selection and not EntryLocked(entries, selection + 1));
  84.         SetDCtlEnable(dlg, ditChange, have_selection and not EntryLocked(entries, selection + 1));
  85.         OutlineDefault1(dlg, ditMainUserItem);
  86.     end; (* DimButtons *)
  87.  
  88.     procedure UserItemUpdate (dlg: DialogPtr; item: integer);
  89.         var
  90.             list_rect: Rect;
  91.     begin
  92.         GetDItemRect(dlg, item, list_rect);
  93.         PenNormal;
  94.         InsetRect(list_rect, -1, -1);
  95.         FrameRect(list_rect);
  96.         LUpdate(dlg^.visRgn, ListHandle(windowinfo[GetWindowType(dlg)].items[item]^.spare_data));
  97.     end; (* UserItemUpdate *)
  98.  
  99.     procedure MyLDEF (message: integer; select: boolean; var r: Rect; the_cell: Cell; offset: integer; datalen: integer; lh: ListHandle);
  100.         var
  101.             entries: Handle;
  102.  
  103.         procedure LDDraw;
  104.             const
  105.                 HiliteMode = $938;
  106.             var
  107.                 appspec: InternalAppSpec;
  108.                 err: OSErr;
  109.                 suite: Handle;
  110.                 cur_x: integer;
  111.                 junk: OSErr;
  112.                 tmprect: Rect;
  113.                 sys_font_info: FontInfo;
  114.                 top: integer;
  115.                 transfer: integer;
  116.                 rgn: RgnHandle;
  117.                 rgn2: RgnHandle;
  118.         begin
  119.             if datalen = 0 then begin
  120.                 GetNthElement(entries, the_cell.v + 1, appspec);
  121.                 EraseRect(r);
  122.                 cur_x := 0;
  123.                 rgn := NewRgn;
  124.                 if system7 then begin
  125.                     tmprect := r;
  126.                     tmprect.bottom := tmprect.top + 32;
  127.                     tmprect.right := tmprect.left + 32;
  128.                     OffsetRect(tmprect, (kCellHeight - 32) div 2, (kCellHeight - 32) div 2);
  129.                     junk := GetDTDBIconSuiteCached('APPL', appspec.appspec.fCreator, suite);
  130.                     if suite <> nil then begin
  131.                         if select then begin
  132.                             transfer := ttSelected;
  133.                         end else begin
  134.                             transfer := ttNone;
  135.                         end; (* if *)
  136.                         err := PlotIconSuite(tmprect, atNone, transfer, suite);
  137.                         junk := IconSuiteToRgn(rgn, tmprect, atNone, suite);
  138.                     end; (* if *)
  139.                     cur_x := cur_x + kCellHeight;
  140.                 end;
  141.                 cur_x := cur_x + 2;
  142.  
  143.                 TextFont(systemFont);
  144.                 GetFontInfo(sys_font_info);
  145.  
  146.                 top := (kCellHeight - (sys_font_info.ascent + sys_font_info.descent)) div 2;
  147.                 TextFont(systemFont);
  148.                 MoveTo(r.left + cur_x, r.top + top + sys_font_info.ascent);
  149.                 DrawString(concat(TPCopy(appspec.key, length(kICHelper) + 1, 255), GetAString(128, 5), appspec.appspec.name));
  150.  
  151.                 if select then begin
  152.                     rgn2 := NewRgn;
  153.                     RectRgn(rgn2, r);
  154.                     if has_colorQD then begin
  155.                         BitClr(Ptr(HiliteMode), pHiliteBit);
  156.                     end; (* if *)
  157.                     XorRgn(rgn, rgn2, rgn2);
  158.                     InvertRgn(rgn2);
  159.                     DisposeRgn(rgn2);
  160.                 end; (* if *)
  161.                 if rgn <> nil then begin
  162.                     DisposeRgn(rgn);
  163.                 end; (* if *)
  164.             end; (* if *)
  165.         end;
  166.  
  167.     begin
  168.         offset := offset; { Unused }
  169.         SetPort(lh^^.port);
  170.         entries := Handle(windowinfo[GetWindowType(lh^^.port)].items[ditList]^.data);
  171.         case message of
  172.             lInitMsg: 
  173.                 ;
  174.             lDrawMsg: 
  175.                 LDDraw;
  176.             lHiliteMsg: 
  177.                 LDDraw;
  178.             lCloseMsg: 
  179.                 ;
  180.             otherwise
  181.                 ;
  182.         end;
  183.     end; (* MyLDEF *)
  184.  
  185.     function WhatOpenHelper (wt: WindowType; item: integer): OSErr;
  186.         var
  187.             dlg: DialogPtr;
  188.             entries: Handle;
  189.             attr: longint;
  190.             err: OSErr;
  191.             count: longint;
  192.             list_rect: Rect;
  193.             data_rect: Rect;
  194.             cell_size: Point;
  195.             lh: ListHandle;
  196.             tmpapspec: InternalAppSpec;
  197.             ndx: longint;
  198.             size: longint;
  199.     begin
  200.         err := noErr;
  201.         windowinfo[wt].items[item]^.spare_data := nil;
  202.         windowinfo[wt].items[item]^.data := nil;
  203.         dlg := windowinfo[wt].window;
  204.         SetDItemHandle(dlg, item, @UserItemUpdate);
  205.         entries := NewHandle(0);
  206.         if entries = nil then begin
  207.             err := memFullErr;
  208.         end; (* if *)
  209.         if err = noErr then begin
  210.             ndx := 1;
  211.             repeat
  212.                 err := ICMapErr(ICGetIndPref(GetInstance, ndx, tmpapspec.key));
  213.                 if err = noErr then begin
  214.                     if IUEqualString(TPCopy(tmpapspec.key, 1, length(kICHelper)), kICHelper) = 0 then begin
  215.                         size := sizeof(tmpapspec.appspec);
  216.                         err := ICMapErr(ICGetPref(GetInstance, tmpapspec.key, attr, @tmpapspec.appspec, size));
  217.                         if err = noErr then begin
  218.                             tmpapspec.locked := TPbtst(attr, ICattr_locked_bit) | IsDocLocked;
  219.                             err := PtrAndHand(@tmpapspec, entries, sizeof(InternalAppSpec));
  220.                         end; (* if *)
  221.                     end; (* if *)
  222.                 end; (* if *)
  223.                 ndx := ndx + 1;
  224.             until err <> noErr;
  225.         end; (* if *)
  226.         if err = icPrefNotFoundErr then begin
  227.             err := noErr;
  228.         end; (* if *)
  229.         if err = noErr then begin
  230.             count := GetHandleSize(entries) div sizeof(InternalAppSpec);
  231.             windowinfo[wt].items[item]^.data := Ptr(entries);
  232.             GetDItemRect(dlg, item, list_rect);
  233.             list_rect.right := list_rect.right - 15;
  234.             SetRect(data_rect, 0, 0, 1, count);
  235.             SetPt(cell_size, list_rect.right - list_rect.left, kCellHeight);
  236.             lh := LNew(list_rect, data_rect, cell_size, 128, dlg, true, false, false, true);
  237.             if lh = nil then begin
  238.                 err := memFullErr;
  239.             end; (* if *)
  240.         end; (* if *)
  241.         if err = noErr then begin
  242.             lh^^.refCon := ord(@MyLDEF);
  243.             lh^^.selFlags := lOnlyOne;
  244.             windowinfo[wt].items[item]^.spare_data := Ptr(lh);
  245.             DimButtons(wt);
  246.             SetUpDefaultOutline(dlg, ditChange, ditMainUserItem);
  247.             windowinfo[wt].selected_item := ditList;
  248.         end; (* if *)
  249.         WhatOpenHelper := err;
  250.     end; (* WhatOpenHelper *)
  251.  
  252.     function ChooseApplication (var spec: ICAppSpec): boolean;
  253.         var
  254.             info: FInfo;
  255.             fs: FSSpec;
  256.             err: OSErr;
  257.     begin
  258.         err := ICStandardGetFile('APPL', fs, info);
  259.         DisplayError(acChooseApplication, err);
  260.         if err = noErr then begin
  261.             spec.fCreator := info.fdCreator;
  262.             spec.name := fs.name;
  263.         end; (* if *)
  264.         ChooseApplication := err = noErr;
  265.     end; (* ChooseApplication *)
  266.  
  267.     procedure FixButton (dlg: DialogPtr);
  268.         var
  269.             t1, t2: Str255;
  270.     begin
  271.         GetItemText(dlg, ditAppName, t1);
  272.         GetItemText(dlg, ditHelper, t2);
  273.         SetDCtlEnable(dlg, ditOK, (t1 <> '') and (t2 <> ''));
  274.         OutlineDefault1(dlg, ditAddUserItem);
  275.     end; (* FixButton *)
  276.  
  277.     function DoAddFilter (dlg: DialogPtr; var event: EventRecord; var item: integer): boolean;
  278.         var
  279.             res: boolean;
  280.     begin
  281.         res := CancelModalFilter(dlg, event, item);
  282.         FixButton(dlg);
  283.         DoAddFilter := res;
  284.     end;(* DoAddFilter *)
  285.  
  286.     function DoEdit (entries: Handle; lh: ListHandle; var choosen_app: InternalAppSpec): OSErr;
  287.         var
  288.             dlg: DialogPtr;
  289.             item: integer;
  290.             err: OSErr;
  291.             saved_state: Ptr;
  292.     begin
  293.         entries := entries; { Unused }
  294.         lh := lh; { Unused }
  295.         err := noErr;
  296.         dlg := GetNewDialog(800, nil, WindowPtr(-1));
  297.         if dlg = nil then begin
  298.             err := memFullErr;
  299.         end; (* if *)
  300.         if err = noErr then begin
  301.             SetUpDefaultOutline(dlg, ditOK, ditAddUserItem);
  302.             SetItemText(dlg, ditHelper, choosen_app.key);
  303.             SetItemText(dlg, ditAppName, choosen_app.appspec.name);
  304.             SelectDialogItemText(dlg, ditHelper, 0, 255);
  305.             FixButton(dlg);
  306.             ShowWindow(dlg);
  307.             DisableMenuBar(saved_state, -1);
  308.             InitCursor;
  309.             repeat
  310.                 MovableModalDialog(@DoAddFilter, item);
  311.                 case item of
  312.                     ditChooseApplication:  begin
  313.                         if ChooseApplication(choosen_app.appspec) then begin
  314.                             SetItemText(dlg, ditAppName, choosen_app.appspec.name);
  315.                             FixButton(dlg);
  316.                         end; (* if *)
  317.                     end;
  318.                     otherwise
  319.                         ;
  320.                 end; (* case *)
  321.             until item in [ditOK, ditCancel];
  322.             if item = ditOK then begin
  323.                 GetItemText(dlg, ditHelper, choosen_app.key);
  324.                 choosen_app.key := concat(kICHelper, choosen_app.key);
  325.             end else begin
  326.                 err := userCanceledErr;
  327.             end; (* if *)
  328.             ReEnableMenuBar(saved_state);
  329.             DisposeDialog(dlg);
  330.         end; (* if *)
  331.         DoEdit := err;
  332.     end;
  333.  
  334.     function DoAdd (entries: Handle; lh: ListHandle): OSErr;
  335.         var
  336.             choosen_app: InternalAppSpec;
  337.             junk: integer;
  338.             err: OSErr;
  339.     begin
  340.         choosen_app.appspec.name := '';
  341.         choosen_app.locked := false;
  342.         choosen_app.key := '';
  343.         err := DoEdit(entries, lh, choosen_app);
  344.         if err = noErr then begin
  345.             err := PtrAndHand(@choosen_app, entries, sizeof(choosen_app));
  346.             if err = noErr then begin
  347.                 junk := LAddRow(1, 32767, lh);
  348.             end; (* if *)
  349.         end;
  350.         DoAdd := err;
  351.     end; (* DoAdd *)
  352.  
  353.     function DoChange (selection: integer; entries: Handle; lh: ListHandle): OSErr;
  354.         var
  355.             err: OSErr;
  356.             tmpspec: InternalAppSpec;
  357.     begin
  358.         GetNthElement(entries, selection + 1, tmpspec);
  359.         Delete(tmpspec.key, 1, length(kICHelper));
  360.         err := DoEdit(entries, lh, tmpspec);
  361.         if err = noErr then begin
  362.             SetNthElement(entries, selection + 1, tmpspec);
  363.             err := noErr;
  364.         end else begin
  365.             err := userCanceledErr;
  366.         end; (* if *)
  367.         DoChange := err;
  368.     end; (* DoChange *)
  369.  
  370.     function DoDelete (selection: integer; entries: Handle; lh: ListHandle): OSErr;
  371.         var
  372.             err: OSErr;
  373.             apspec: InternalAppSpec;
  374.             pos: longint;
  375.             junk: OSErr;
  376.     begin
  377.         err := ICMapErr(ICBegin(GetInstance, icReadWritePerm));
  378.         if err = noErr then begin
  379.             GetNthElement(entries, selection + 1, apspec);
  380.             err := ICDeletePref(GetInstance, apspec.key);
  381.             junk := ICMapErr(ICEnd(GetInstance));
  382.         end; (* if *)
  383.         if err = noErr then begin
  384.             pos := Munger(entries, selection * sizeof(InternalAppSpec), nil, sizeof(InternalAppSpec), Ptr(-1), 0);
  385.             err := MemError;
  386.             if err = noErr then begin
  387.                 LDelRow(1, selection, lh);
  388.             end; (* if *)
  389.         end; (* if *)
  390.         DoDelete := err;
  391.     end; (* DoDelete *)
  392.  
  393.     function WhatClickHelper (wt: WindowType; item: integer; er: eventRecord): OSErr;
  394.         var
  395.             lh: ListHandle;
  396.             entries: Handle;
  397.             selection: integer;
  398.             err: OSErr;
  399.     begin
  400.         entries := Handle(windowinfo[wt].items[ditList]^.data);
  401.         lh := ListHandle(windowinfo[wt].items[ditList]^.spare_data);
  402.         GlobalToLocal(er.where);
  403.         selection := SelectedLine(lh);
  404.         err := 1;
  405.         case item of
  406.             ditAdd: 
  407.                 err := DoAdd(entries, lh);
  408.             ditChange: 
  409.                 err := DoChange(selection, entries, lh);
  410.             ditDelete: 
  411.                 if selection <> -1 then begin
  412.                     err := DoDelete(selection, entries, lh);
  413.                 end; (* if *)
  414.             ditList:  begin
  415.                 if LClick(er.where, 0, lh) then begin
  416.                     selection := SelectedLine(lh);            (* selection may have been changed by LClick *)
  417.                     if EntryLocked(entries, selection + 1) then begin
  418.                         LockedAlert(wt, item);
  419.                         err := userCanceledErr;
  420.                     end else begin
  421.                         FlashItem(windowinfo[wt].window, ditChange);
  422.                         err := DoChange(selection, entries, lh);
  423.                     end; (* if *)
  424.                 end; (* if *)
  425.             end;
  426.         end; (* case *)
  427.         if err = noErr then begin
  428.             DirtyDocument;
  429.         end; (* if *)
  430.         if err = 1 then begin
  431.             err := noErr;
  432.         end; (* if *)
  433.         DimButtons(wt);
  434.         WhatClickHelper := err;
  435.     end; (* WhatClickHelper *)
  436.  
  437.     function WhatFlushHelper (wt: WindowType; item: integer): OSErr;
  438.         var
  439.             err: OSerr;
  440.             entries: Handle;
  441.             i: integer;
  442.             appspec: InternalAppSpec;
  443.             first_err: OSErr;
  444.     begin
  445.         item := item; { Unused }
  446.         err := noErr;
  447.         entries := Handle(windowinfo[wt].items[ditList]^.data);
  448.         first_err := noErr;
  449.         for i := 1 to GetHandleSize(entries) div sizeof(InternalAppSpec) do begin
  450.             GetNthElement(entries, i, appspec);
  451.             if not appspec.locked then begin
  452.                 err := ICMapErr(ICSetPref(GetInstance, appspec.key, ICattr_no_change, @appspec.appspec, sizeof(appspec.appspec)));
  453.             end;
  454.             if first_err = noErr then begin
  455.                 first_err := err;
  456.             end; (* if *)
  457.         end; (* for *)
  458.         err := first_err;
  459.         WhatFlushHelper := err;
  460.     end; (* WhatFlushHelper *)
  461.  
  462.     function WhatCloseHelper (wt: WindowType; item: integer): OSErr;
  463.     begin
  464.         LDispose(ListHandle(windowinfo[wt].items[item]^.spare_data));
  465.         DisposeHandle(Handle(windowinfo[wt].items[ditList]^.data));
  466.         WhatCloseHelper := noErr;
  467.     end; (* WhatCloseHelper *)
  468.  
  469.     function WhatActivateHelper (wt: WindowType; item: integer; activate: boolean): OSErr;
  470.     begin
  471.         LActivate(activate, ListHandle(windowinfo[wt].items[item]^.spare_data));
  472.         WhatActivateHelper := noErr;
  473.     end; (* WhatActivateHelper *)
  474.  
  475.     function GetEntryName (list: ListHandle; c: cell): str255;
  476.         var
  477.             appspec: InternalAppSpec;
  478.             entries: handle;
  479.     begin
  480.         GetEntryName := '';
  481.         entries := Handle(windowinfo[GetWindowType(list^^.port)].items[ditList]^.data);
  482.         GetNthElement(entries, c.v + 1, appspec);
  483.         GetEntryName := concat(TPCopy(appspec.key, length(kICHelper) + 1, 255), GetAString(128, 5), appspec.appspec.name);
  484.     end;
  485.  
  486.     function WhatKeyHelper (wt: WindowType; item: integer; er: EventRecord): OSErr;
  487.         var
  488.             ch: integer;
  489.             lh: ListHandle;
  490.             err: OSErr;
  491.             entries: Handle;
  492.             selection: integer;
  493.     begin
  494.         err := noErr;
  495.         if (er.what = keyDown) or (er.what = autoKey) then begin
  496.             ch := BAND(er.message, $FF);
  497.             case ch of
  498.                 crChar, enterChar:  begin
  499.                     if GetDCtlEnable(windowinfo[wt].window, ditChange) then begin
  500.                         entries := Handle(windowinfo[wt].items[ditList]^.data);
  501.                         lh := ListHandle(windowinfo[wt].items[item]^.spare_data);
  502.                         selection := SelectedLine(lh);
  503.                         FlashItem(windowinfo[wt].window, ditChange);
  504.                         err := DoChange(selection, entries, lh);
  505.                         if err = noErr then begin
  506.                             DirtyDocument;
  507.                         end;
  508.                     end;
  509.                 end;
  510.                 otherwise begin
  511.                     DoListKey(ListHandle(windowinfo[wt].items[item]^.spare_data), er, GetEntryName);
  512.                     DimButtons(wt);
  513.                 end;
  514.             end;
  515.         end;
  516.         WhatKeyHelper := err;
  517.     end; (* WhatKeyHelper *)
  518.  
  519.     function WhatCursorHelper (wt: WindowType; item: integer; pt: Point; cursorid: integer): OSErr;
  520.         var
  521.             r: Rect;
  522.     begin
  523.         GetDItemRect(windowinfo[wt].window, item, r);
  524.         InsetRect(r, 15, 0);
  525.         if PtInRect(pt, r) then begin
  526.             SetCursor(GetCursor(cursorid)^^);
  527.         end else begin
  528.             InitCursor;
  529.         end; (* if *)
  530.         WhatCursorHelper := noErr;
  531.     end; (* WhatCursorHelper *)
  532.  
  533.     procedure HelperSetSelection(key:Str255);
  534.         var
  535.             i:longInt;
  536.             window:WindowPtr;
  537.             entries:Handle;
  538.             appspec:InternalAppSpec;
  539.             err:OSStatus;
  540.             list:ListHandle;
  541.     begin
  542.         key := concat(kICHelper,key);
  543.         window := GetWindowPtr(WT_Helper);
  544.         if window <> nil then begin
  545.             list := ListHandle(windowinfo[WT_Helper].items[ditList]^.spare_data);
  546.             entries := Handle(windowinfo[WT_Helper].items[ditList]^.data);
  547.             for i := 1 to GetHandleSize(entries) div sizeof(InternalAppSpec) do begin
  548.                 GetNthElement(entries, i, appspec);
  549.                 if IUEqualString(appspec.key, key) = 0 then begin
  550.                     LSetSingleSelection(list, i - 1);
  551.                     DimButtons(WT_Helper);
  552.                     if GetDCtlEnable(window, ditChange) then begin
  553.                         err := DoChange(i - 1, entries, list);
  554.                     end;
  555.                     leave;
  556.                 end;
  557.             end;
  558.         end;
  559.     end;
  560.     
  561. end. (* ICHelperWhat *)
  562.